package com.ktkj.init.utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class DateUtils extends org.apache.commons.lang3.time.DateUtils {

    private static String[] parsePatterns = {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss"};
    private static String[] parsePatterns1 = {"yyyy", "MM", "dd", "E"};

    /**
     * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, String pattern) {
        String formatDate = null;
        if (StringUtils.isNotBlank(pattern)) {
            formatDate = DateFormatUtils.format(date, pattern);
        } else {
            formatDate = DateFormatUtils.format(date, parsePatterns[0]);
        }
        return formatDate;
    }

    /**
     * Format date string.
     *
     * @param date the date
     * @return the string
     * @author :yanlixiong
     * @date :2021-12-06 09:43:00
     */
    public static String formatDate(Date date) {
        return formatDate(date, parsePatterns[0]);
    }


    /**
     * Format date time string.
     *
     * @param date the date
     * @return the string
     * @author :yanlixiong
     * @date :2021-12-06 09:43:01
     */
    public static String formatDateTime(Date date) {
        return formatDate(date, parsePatterns[1]);
    }


    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd）
     */
    public static String getDate() {
        return getDate(parsePatterns[0]);
    }

    /**
     * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String getDate(String pattern) {
        return DateFormatUtils.format(new Date(), pattern);
    }

    public static String getDateTime() {
        return getDate(parsePatterns[1]);
    }


    /**
     * 得到当前年份字符串 格式（yyyy）
     */
    public static String getYear() {
        return formatDate(new Date(), parsePatterns1[0]);
    }

    /**
     * 得到当前月份字符串 格式（MM）
     */
    public static String getMonth() {
        return formatDate(new Date(), parsePatterns1[1]);
    }

    /**
     * 得到当天字符串 格式（dd）
     */
    public static String getDay() {
        return formatDate(new Date(), parsePatterns1[2]);
    }

    /**
     * 得到当前星期字符串 格式（E）星期几
     */
    public static String getWeek() {
        return formatDate(new Date(), parsePatterns1[3]);
    }

    public static Date strToDateTime(String str, String format) {
        Date date = null;
        if (str != null) {
            SimpleDateFormat df = new SimpleDateFormat(format);
            try {
                date = df.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return date;
    }

    /**
     * 字符串类型转dateTime格式
     *
     * @param str
     * @return
     */
    public static Date strToDateTime(String str) {
        Date date = null;
        if (StringUtils.isNotBlank(str)) {
            SimpleDateFormat df = new SimpleDateFormat(parsePatterns[1]);
            try {
                date = df.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return date;
    }

    public static Date strToDate(String str) {
        Date date = null;
        if (StringUtils.isNotBlank(str)) {
            SimpleDateFormat df = new SimpleDateFormat(parsePatterns[0]);
            try {
                date = df.parse(str);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return date;
    }

    /**
     * 字符串转date类型自动追加00:00:00
     *
     * @param str
     * @return
     */
    public static Date strToDateTimeStart(String str) {
        Date date = null;
        if (StringUtils.isNotBlank(str)) {
            str += " 00:00:00";
            date = strToDateTime(str);
        }
        return date;
    }

    /**
     * 字符串转date类型自动追加23:59:59
     *
     * @param str
     * @return
     */
    public static Date strToDateTimeEnd(String str) {
        Date date = null;
        if (StringUtils.isNotBlank(str)) {
            str += " 23:59:59";
            date = strToDateTime(str);
        }
        return date;
    }

    /**
     * Parse date date.
     *
     * @param dateStr the date str
     * @return the date
     * @author :yanlixiong
     * @date :2021-12-06 09:48:27
     */
    public static Date parseDate(String dateStr) {
        Date date = null;
        try {
            date = parseDate(dateStr, parsePatterns);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    /**
     * 得到当前时间是第几周(计算方式周一到周日)
     *
     * @param date the date
     * @return the date
     * @author :yanlixiong
     * @date :2021-12-06 09:48:27
     */
    public static int getWeekNum(Date date) {
        int num = 0;
        try {
            Calendar calendar = Calendar.getInstance();
            calendar.setFirstDayOfWeek(Calendar.MONDAY);
            calendar.setTime(date);
            num = calendar.get(Calendar.WEEK_OF_YEAR);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return num;
    }

    public static void main(String[] args) {
        try {
            /*System.out.println(getDate());
            System.out.println(getDate(parsePatterns[2]));
            System.out.println(getDateTime());
            System.out.println(getYear());
            System.out.println(getMonth());
            System.out.println(getDay());
            System.out.println(getWeek());*/
            String[] dates = {"2022-01-01", "2022-01-02", "2022-01-03", "2022-09-18", "2022-09-19"};
            for (int i = 0; i < dates.length; i++) {
                Date date = strToDate(dates[i]);
                System.out.println(dates[i] + "=========第" + getWeekNum(date) + "周");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
